/**
* \mainpage Bandas de Bollinger - Bollinger Bands
*
*
*
* \section intro_sec Introducao
*
*   A finalidade deste conjunto de classes eh descrever os metodos para \n
*   o calculo da Bandas de Bollinger. Este indicador possui uma forte relacao com a volatilidade, \n
*   possibilitando, assim, a sua comparacao com os niveis de precos num determinado periodo de tempo.\n
*   O maior objetivo das bandas Bollinger eh fornecer uma ideia relativa de alto e baixo. \n
*   Por definicao, os precos sao altos na linha (banda) superior e baixos na linha (banda) inferior.
*
*
* \section hist_sec Historico
* As bandas Bollinger sao ferramentas de analise tecnica criadas por John Bollinger no inicio dos anos 80.
*
*
* @header      bollingerbands.h
* @version     1.1
* @date        06/10/2010
* @author      Rafael Tosta Santos <rafa.ecomp@gmail.com> \n
* @group       UEFS - Engenharia da Computacao
* @see         Projeto Anual I - Prof. Angelo Duarte\n Candelabro
* @link        Repositorio <http://candelabro.googlecode.com/svn/trunk/candelabro>
* @ref         Candelabro::bollingerbands
*
*/


#include "bollingerbands.h"
#include <iostream>
#include <math.h>
#include <string>
#include <fstream>
const int K = 2;
using namespace std;

/** Construtor vazio*/
BollingerBands::BollingerBands()
{
}

/** Calcula as Bandas de Bollinger*/
void BollingerBands::bollingerBandesCalc(double *fechamento, int numDias, int PERIODO){
    this->PERIODO = PERIODO;
    int tamanho = numDias - PERIODO;
    double fech[PERIODO];
    double MMS[tamanho];
    double DP[tamanho];
    double BS[tamanho];
    double BI[tamanho];
    int j = 0;

     //ofstream fout("TesteBollingerBands.txt"); // Cria arquivo para grava��o em modo texto

    if(10 <= numDias){
//        cout<<"\n\nBandas de Bollinger\n\n\n";

//        cout << "MMS,"<< "BS,"<<"BI\n";


    for(int i = 0; i< tamanho; i++){

            for(int o = 0; o< PERIODO; o++){
                 fech[o] = fechamento[j + o];

             }
            j++;

              MMS[i] = this->calculoMediaMovelSimples(fech);
              DP[i] = this->calculoDesvioPadrao(MMS[i],fech);
              BS[i] = this->geraBandaSuperior(MMS[i],DP[i]);
              BI[i] = this->geraBandaInferior(MMS[i],DP[i]);

           //fout << MMS[i]<<","<< BS[i]<< ","<< BI[i]<<"\n"; //Salva os valores no arquivo
           // cout<< MMS[i]<<", " << DP[i]<<", "<< BS[i]<<", "<< BI[i]<<"\n"; // imprime na tela os valores

        this->bandaInferior = BI;
        this->bandaSuperior = BS;

        }
    }else{
//        cout << "Naum eh possivel calcular!\n\n";
    }
//    fout.close();

}

/** Calcula a Media Movel Simples*/
double BollingerBands::calculoMediaMovelSimples(double *fechamento){
    double m = 0;
    for (int i = 0; i < PERIODO ;i++){
        m = m + fechamento[i];
    }

return m/PERIODO;
}

/** Calcula o Devio Padrao*/
double BollingerBands::calculoDesvioPadrao(double MMS, double *fechamento){
    double m = 0;
    double temp = 0;
    for (int i = 0; i < PERIODO ;i++){
        temp = fechamento[i] - MMS;
        m = m + temp*temp;
    }
return sqrt(m/PERIODO);
}

/** Gera a Banda Superior*/
double BollingerBands::geraBandaSuperior(double MMS,double DP){
return MMS + K*DP;
}

/** Gera a banda inferior*/
double BollingerBands::geraBandaInferior(double MMS,double DP){
return MMS - K*DP;
}

